#!/bin/bash
source config.conf
# 定义文件夹路径
FOLDER="待上传文件"
UPLOADED_FOLDER="已上传文件"
# 获取当前时间戳（精确到秒）
timestamp=$(date +%s)
# 获取脚本开始时的时间戳
start_time=$timestamp
# 发起请求
RESPONSE=$(curl -s -H "Authorization: $TK" "$STSUrl")

# 解析响应数据
OSSParamsData=$(echo $RESPONSE | jq -r '.data')
# 获取 AccessKeyId
AccessKeyId=$(echo $OSSParamsData | jq -r '.accessKeyId')
# 获取 AccessKeySecret
AccessKeySecret=$(echo $OSSParamsData | jq -r '.accessKeySecret')
# 获取 SecurityToken
SecurityToken=$(echo $OSSParamsData | jq -r '.securityToken')
# 获取 endpoint
Endpoint=$(echo $OSSParamsData | jq -r '.endpoint')
echo "OSS参数准备就绪"

# 定义普通数组来存储图片和视频文件名
images=()
videos=()

# 读取文件夹中的所有文件名
files=$(ls "$FOLDER")

# 遍历所有文件名，分别存储在 images 和 videos 数组中
for file in $files; do
  # 提取文件扩展名
  ext="${file##*.}"
  # 提取文件名中的数字部分
  if [[ $file =~ ([0-9]+)\. ]]; then
    num="${BASH_REMATCH[1]}"
    # echo $num
    if [[ $ext =~ ^(png|PNG|jpg|JPG|jpeg|JPEG|heic|HEIC)$ ]]; then
      images+=("$num:$file")
    elif [[ $ext =~ ^(mp4|MP4|mov|MOV)$ ]]; then
      videos+=("$num:$file")
    fi
  fi
done

# 遍历 images 数组，找出对应的 video 文件，生成文件名对
filePairs=()

for img in "${images[@]}"; do
  IFS=":" read -r img_num img_file <<< "$img"
  for vid in "${videos[@]}"; do
    IFS=":" read -r vid_num vid_file <<< "$vid"
    if [[ "$img_num" == "$vid_num" ]]; then
      echo "$img_file $vid_file"
      filePairs+=("$img_file $vid_file")
    fi
  done
done
echo $filePairs

# 创建已上传文件夹（如果不存在）
if [ ! -d "$UPLOADED_FOLDER" ]; then
  mkdir -p "$UPLOADED_FOLDER"
fi

# 定义上传函数
upload_file() {
  local file_path=$1
  # 上传文件到阿里云 OSS
  ossutil cp $file_path oss://$Bucket/comment/${timestamp}/ -i $AccessKeyId -k $AccessKeySecret -t $SecurityToken -e $Endpoint --mode StsToken --region $Region
  # 检查上传结果
  if [ $? -eq 0 ]; then
    echo "✅ 文件上传成功"
    # 检查 log/success.log 文件是否存在，不存在则创建
    if [ ! -d log ]; then
      mkdir log
    fi
    if [ ! -f log/success.log ]; then
      touch log/success.log
    fi

    # 将成功的文件路径写入 log/success.log
    echo "$file_path" >> log/success.log
  else
    echo "❌ 文件上传失败 $file_path"
    exit 1
  fi

}

# 定义移动文件函数
move_file() {
  local file_path=$1
  local file_name=$(basename "$file_path")
  mv "$file_path" "$UPLOADED_FOLDER/$file_name"
}

successCount=0
taskCount=0
main() {
  totalCompressCostTime=0
  # 主循环
  for pair in "${filePairs[@]}"; do
    IFS=' ' read -r imageFile videoFile <<< "$pair"
    # 从 imageFile 中提取作品 id
    id=$(echo "$imageFile" | cut -d '.' -f 1)
    imageFilePath="$FOLDER/$imageFile"
    videoFilePath="$FOLDER/$videoFile"


    unCompressedPath="待压缩文件/${videoFile}"
    # 压缩文件
    # 先获取文件大小
    file_size=$(ffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 "$videoFilePath")
    # 超过 50M 的压缩 50 * 1024 * 1024 字节
    if [ $file_size -gt 52428800 ]; then
      # 把文件移动到 待压缩文件夹
      mv $videoFilePath "待压缩文件/"
      echo "🚀 文件大小超过 50M，开始压缩"
      compressStartTime=$(date +%s)
      echo "开始压缩视频"
      # 调整视频分辨率
      ffmpeg -i $unCompressedPath -vcodec libx264 -crf 23 $videoFilePath
      compressEndTime=$(date +%s)
      # 计算脚本运行的耗时（秒）
      compressCostTime=$((compressEndTime - compressStartTime))
      totalCompressCostTime=$((totalCompressCostTime + compressCostTime))
      new_file_size=$(ffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 "$videoFilePath")
      echo "🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧"
      echo "视频压缩完成，压缩前 $((file_size / 1024 / 1024)) MB，压缩后 $((new_file_size / 1024 / 1024)) MB，用时 $compressCostTime 秒"
      echo "🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧"
      # ffmpeg -i $videoFilePath -vf scale=1280:720 -crf 23 output.mp4
    else
      echo "🚀 文件大小未超过 50M，无需压缩 $videoFilePath"
    fi
    echo "🚀 开始处理文件对 : $imageFilePath, $videoFilePath"
    if [ -f "$imageFilePath" ] && [ -f "$videoFilePath" ]; then
      taskCount=$(($taskCount+1))
      # 检查 log/task.log 文件是否存在，不存在则创建
      if [ ! -d log ]; then
        mkdir log
      fi
      if [ ! -f log/task.log ]; then
        touch log/task.log
      fi
      echo "$imageFilePath" >> log/task.log
      echo "$videoFilePath" >> log/task.log
      echo "🚀 正在上传作品图片 : $imageFilePath"
      if upload_file "$imageFilePath"; then
        echo "🚀 正在上传点评视频 : $videoFilePath"
        if upload_file "$videoFilePath"; then
          # 提交上传的文件
          uploadParams='{"taskId": '${id}', "commentAudio": "'${CDNPrefix}${timestamp}/${videoFile}'", "commentImage": "'${CDNPrefix}${timestamp}/${imageFile}'"}'
          # 发送 POST 请求并携带头部信息
          RESPONSE=$(curl -X POST -H "Auth: $TK" -H "Content-Type: application/json" -d "$uploadParams" "$CommentCommitUrl")
          # 输出响应结果
          echo "🚀 点评信息提交: $uploadParams"
          # echo "$RESPONSE"
          code=$(echo $RESPONSE | jq -r '.code')
          msg=$(echo $RESPONSE | jq -r '.msg')
          echo $code
          if [ $code -eq 200 ]; then
            move_file "$imageFilePath"
            echo "✅ 作品图片移动到已上传: $imageFilePath"
            move_file "$videoFilePath"
            echo "✅ 点评视频移动到已上传: $videoFilePath"
            echo "✅ 点评信息提交成功"
            successCount=$((successCount + 1))
          else
            echo "❌ 点评信息提交失败"
            echo "❌ 错误码: $code"
            echo "❌ 错误信息: $msg"
            echo "❌❌❌❌❌❌❌❌"
            echo ""
          fi
        else
          echo "❌ 点评视频上传失败 : $videoFilePath"
          echo "❌❌❌❌❌❌❌❌"
          echo ""
        fi
      else
        echo "❌ 作品图片上传失败: $imageFilePath"
        echo "❌❌❌❌❌❌❌❌"
        echo ""
      fi
    else
      echo "❌ 文件名结对: $imageFilePath, $videoFilePath"
      echo "❌❌❌❌❌❌❌❌"
      echo ""
    fi
  done
  # 获取脚本结束时的时间戳
  end_time=$(date +%s)

  # 计算脚本运行的耗时（秒）
  elapsed_time=$((end_time - start_time))
  echo "脚本运行耗时 $elapsed_time 秒; 其中视频压缩耗时 $totalCompressCostTime 秒"
  echo "总计任务: $taskCount"
  echo "成功提交: $successCount"
  if [ $taskCount -gt $successCount ]; then
    echo "❌❌❌ 有任务失败，请检查日志 并联系管理员"
  else
    echo "✅✅✅ 全部任务成功"
  fi
}

# 开始任务
main

